from image_utils import logging # 从image_utils.py中导入logging对象
import numpy as np

def crop_image(image, crop_region):
    """
    裁剪图像
    :param image: 输入图像，PIL.Image对象
    :param crop_region: 裁剪区域,格式为(上,下,左,右)
    :return: 裁剪后的图像
    """
    try:
        logging.info(f"开始裁剪图像，裁剪区域,{crop_region}")
        
        # 从crop_region中提取上、下、左、右的坐标
        top, bottom, left, right = crop_region

        # 直接使用切片操作，裁剪图像 image 生成裁剪后的图像 cropped_image
        cropped_image = image[top:bottom, left:right]

        logging.info("图像裁剪成功")  # 记录成功日志
        return cropped_image
    except Exception as e:
        raise ValueError(f"Error occurred while cropping image: {e}")

def adjust_brightness(image, factor):
    """
    调整图像的亮度。
    :param image: 输入图像，numpy数组。
    :param factor: 亮度调整因子，值为0到2之间，1表示不变，<1表示变暗，>1表示变亮。
    :return: 调整亮度后的图像。
    """
    try:
        logging.info(f"调整图像亮度，因子: {factor}")
        # 确保因子在合理范围内
        factor = max(0, min(factor, 2))
        # 调整亮度
        adjusted_image = np.clip(image * factor, 0, 255).astype(np.uint8)
        logging.info("图像亮度调整成功")
        return adjusted_image
    except Exception as e:
        logging.error(f"调整图像亮度时出错: {e}")
        raise

def apply_threshold(image, threshold_value):
    """
    应用全局阈值处理。
    :param image: 输入图像，numpy数组。
    :param threshold_value: 阈值，0到255之间。
    :return: 应用阈值后的图像。
    """
    try:
        logging.info(f"应用全局阈值处理，阈值: {threshold_value}")
        thresholded_image = np.where(image > threshold_value, 255, 0).astype(np.uint8)
        logging.info("全局阈值处理成功")
        return thresholded_image
    except Exception as e:
        logging.error(f"全局阈值处理时出错: {e}")
        raise

def motion_difference(image, shift):
    """
    计算图像的移动差分。
    :param image: 输入图像，numpy数组。
    :param shift: 平移的像素数，正值表示右移，负值表示左移。
    :return: 移动差分后的图像。
    """
    try:
        logging.info(f"计算移动差分，平移: {shift} 像素")
        if shift == 0:
            return np.zeros_like(image)  # 如果平移为0，返回全零图像

        shifted_image = np.roll(image, shift, axis=1)  # 沿水平方向平移图像
        diff_image = np.abs(image - shifted_image)  # 计算差分
        diff_image[:, :abs(shift)] = 0  # 将平移产生的边缘置为0
        logging.info("移动差分计算成功")
        return diff_image
    except Exception as e:
        logging.error(f"计算移动差分时出错: {e}")
        raise

